-- Definições de tipos

module Types
(
	SymbolsT,
	UserTypesD,
	FunctionsT,
	ExpT,
	ArraysT,
	TLine,
	Var,
	Utype,
	UserType,
	Array,
	Function,
	Error,
	Escopo,
	Expression
	(
		
	),
	Token
	(
		
	)
) where


-- Tabela de símbolos
type SymbolsT = [Var]

-- Tabela de tipos definidos pelo usuário
type UserTypesD = [Utype]

-- Tabela de funções e subrotinas
type FunctionsT = [Function]

-- Tabela de vetores
type ArraysT = [Array]

-- Tabela de expressões
type ExpT = [Expression]



type Error = String
type Escopo = String

-- Número da linha e Token
type TLine = (Int, Token)

-- Informações sobre uma variável
-- Nome, [Tipo valor], Escopo
type Var = (String, [Token], String)

-- Estrutura de tipo definido pelo usuário
-- Tipo, [(Token, Nome do campo)], Escopo
type Utype = (String, [(Token, String)], Escopo)

-- Tipo definido pelo usuário
-- Nome da variável, Tipo definido, Escopo
type UserType = (String, Utype, String)

-- Define um vetor/array
-- Nome, [(Índice, Nome da variável)], Tamanho, Escopo
type Array = (String, [(Int, String)], Int, String)

-- Define a estrutura de uma função
-- Nome, tipo de retorno(Void_tk para subrotinas), lista de argumentos, lista de expressões
type Function = (String, Token, [(String, Token)], [Expression])

-- Define expressões/instruções
data Expression = 
			  Const String															-- <nome_da_constante> - Declaração de constante
			| Variavel String														-- <nome_da_variavel> - Declaração de variável
			| Valor Token
			| Atribuicao String Expression									-- <nome_da_variavel> = <instrução> - Atribuição de valor a variável
			
			| Write [Expression]													-- <bloco_de_instruções>
			| Read [Expression]													-- <bloco_de_instruções>
			
			| If Expression [Expression] [Expression]							-- <condicional> <bloco_de_instruções_true> <bloco_de_instruções_false>
			| DoWhile Expression [Expression]									-- <condicional> <bloco_de_instruções>
			| SelectCase Expression [Expression] Expression
			
			| And Expression Expression
			| Or Expression Expression
			| Not Expression
			
			| Function String [Expression]	Expression						-- <nome_da_função> <nomes_parametros>	<bloco_de_instruções> <retorno>(?)
			| Subroutine String [Expression]									-- <nome_da_função> <nomes_parametros>	<bloco_de_instruções>
			
			| Igual Expression Expression
			| Maior Expression Expression
			| Menor Expression Expression
			| MaiorQ Expression Expression
			| MenorQ Expression Expression
			| Diferente Expression Expression
			
			| Sum Expression Expression
			| Sub Expression Expression
			| Mult Expression Expression
			| Div Expression Expression
			| Exp Expression Expression

-- Define tipo Token
data Token =  
			  Program_tk							-- PROGRAM
			| Plus_tk								-- +
			| Identifier_tk String 				-- Identificador(ID)
			| End_tk									-- END
			| Integer_tk Int						-- INTEGER
			| String_tk Int String				-- CHARACTER [n]
			| Character_tk Char					-- CHARACTER
			| Logical_tk Bool						-- LOGICAL	
			| Real_tk Float						-- REAL
			| Type_tk String						-- TYPE
			| Define_tk								-- DEFINE
			| True_tk								-- TRUE
			| False_tk								-- FALSE
			| And_tk									-- AND
			| Or_tk									-- OR
			| Eqv_tk									-- EQV
			| Neqv_tk								-- NEQV
			| Read_tk								-- READ
			| Write_tk								-- WRITE
			| If_tk									-- IF
			| While_tk								-- WHILE
			| Then_tk								-- THEN
			| Endif_tk								-- ENDIF
			| Else_tk								-- ELSE
			| Default_tk							-- DEFAULT
			| Select_tk								-- SELECT
			| Case_tk								-- CASE
			| Subroutine_tk						-- SUBROUTINE
			| Function_tk							-- FUNCTION
			| ParentesesL_tk						-- (
			| ParentesesR_tk						-- )
			| ContLinha_tk							-- &
			| Equals_tk								-- =
			| Minus_tk								-- -
			| Exponential_tk						-- **
			| Division_tk							-- /
			| Multiplication_tk					-- *
			| Point_tk								-- .
			| MaiorQue_tk							-- >
			| MenorQue_tk							-- <
			| MaiorIgualQue_tk					-- >=
			| MenorIgualQue_tk					-- <=
			| Diferent_tk							-- /=
			| IgualA_tk								-- ==
			| Concat_tk								-- +.
			| Virgula_tk							-- ,
			| PontoVirgula_tk						-- ;
			| ColcheteL_tk							-- [
			| ColcheteR_tk							-- ]
			| Void_tk								-- Utilizado para indicar subrotinas
			| UserType_tk String Token
			| Error_tk
